package com.air.mapper;


import com.air.annotation.AutoFill;
import com.air.dto.BaggagePageQueryDTO;
import com.air.entity.Baggage;
import com.air.enumeration.OperationType;
import com.air.vo.BaggageVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.web.bind.annotation.DeleteMapping;

import java.util.List;

@Mapper
public interface BaggageMapper {


    /**
     * 添加行李订单。
     * 该方法用于将一个新的行李订单插入到系统中。通过@AutoFill注解，自动填充操作类型为INSERT，表明这是一个添加操作。
     *
     * @param baggage 行李订单对象，包含添加订单所需的所有信息。
     */
    @AutoFill(value = OperationType.INSERT)
    void insert(Baggage baggage);


    /**
     * 分页查询行李订单信息。
     *
     * 该方法通过接收一个BaggagePageQueryDTO对象作为参数，来进行行李订单的分页查询。
     * BaggagePageQueryDTO对象中可能包含了查询条件，如订单号、旅客信息等，用于筛选特定的行李订单。
     * 方法返回一个Page<BaggageVO>对象，其中包含了查询结果的分页信息和具体的行李订单详情。
     *
     * @param baggagePageQueryDTO 查询条件对象，包含了分页和过滤条件。
     * @return 返回一个分页对象，其中包含了查询到的行李订单信息。
     */
    Page<BaggageVO> pageQuery(BaggagePageQueryDTO baggagePageQueryDTO);


    /**
     * 修改行李订单。
     * 该方法通过接收一个行李对象来更新已存在的行李订单信息。使用@AutoFill注解自动填充操作类型为更新。
     *
     * @param baggage 要更新的行李对象，包含新的行李信息。
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Baggage baggage);


    /**
     * 批量删除操作接口。
     * 此方法旨在提供一种批量删除实体的途径，通过指定实体的ID列表来执行删除操作。
     *
     * @param ids 待删除实体的ID列表。此参数不应为空，且列表中的ID应为有效值。
     *            如果列表为空或包含无效ID，则可能导致删除操作失败或无操作。
     */
    void deleteBatch(List<Long> ids);



    /**
     * 根据指定的ID查询行李信息。
     *
     * @param id 行李的唯一标识ID。
     * @return 对应ID的行李对象，如果找不到则返回null。
     */
    @Select("select * from baggage where id=#{id}")
    Baggage getById(Long id);



    /**
     * 根据乘客ID查询其对应的行李信息。

     * 通过SQL查询语句，从baggage表中检索与指定乘客ID相关联的所有行李记录。
     * 此方法用于实现对行李数据库的查询操作，以获取特定乘客的所有行李信息。
     *
     * @param id 乘客的唯一标识符，用于匹配baggage表中的passenger_id字段。
     * @return 包含指定乘客所有行李信息的列表。如果该乘客没有行李，则返回空列表。
     */
    @Select("select * from baggage where passenger_id=#{id}")
    List<Baggage> getByPassengerId(Long id);



    /**
     * 根据航空公司的ID查询对应的行李信息。
     *
     * 本方法通过SQL查询语句，从数据库中检索与指定航空公司ID相关的所有行李信息。
     * 使用MyBatis的注解@Select来指定SQL语句，其中#{id}作为参数占位符，用于动态替换SQL中的航空公司ID。
     *
     * @param id 航空公司的唯一标识符，用于定位特定航空公司的行李信息。
     * @return 返回一个List集合，包含所有匹配的行李对象。如果没有找到任何匹配项，返回空列表。
     */
    @Select("select * from baggage where airline_id=#{id}")
    List<Baggage> list(Long id);

    /**
     * 旅客分页查询
     * @param baggagePageQueryDTO
     * @return
     */
    Page<BaggageVO> pageQueryByPassenger(BaggagePageQueryDTO baggagePageQueryDTO);
}
